I 数据库
010 不用 EOF 以加快记录循环 98-8-22
通常我们使用以下的代码进行记录循环:
Do while not records.eof
combo1.additem records![Full Name]
records.movenext
loop
结果是每个循环中数据库都要进行一次数据结束测试。在大量的记录的情况下,
浪费的时间相当大。 而使用以下的代码, 可以提高近 1/3 的速度:
records.movelast
intRecCount=records.RecordCount
records.movefirst
for intCounter=1 to intRecCount
combo1.additem records![Full Name]
records.movenext
next intCounter
009 断开所有的数据连接 98-8-21
如果在代码中使用了数据控件如 DAO, RDO, 或 ADO,
在退出时应该关闭所有打开的 recordset, database,和 workspace
。 虽然对象能自动注销, 但是数据连接不会马上断开,
可能会导致一些内存不能被系统重新分配。
下面的代码可以关闭所有打开的 DAO workspace, 并释放所占的内存。
Private Sub Form_Unload(Cancel As Integer)
On Error Resume Next
'
Dim ws As Workspace
Dim db As Database
Dim rs As Recordset
'
For Each ws In Workspaces
For Each db In ws.Databases
For Each rs In
db.Recordsets
rs.Close
Set rs = Nothing
Next
db.Close
Set db = Nothing
Next
ws.Close
Set ws = Nothing
Next
'
End Sub
008 取得下个自动生成的 ID 98-8-20
在许多数据库里我们使用了自动增加的 ID,
能取得下个自动产生的 ID, 意味着在数据增加后, 不再需要使用
LastModified 属性和 bookmarks。
With Data1.Recordset
.AddNew
MsgBox !ID '下个自动生成的 ID
.CancelUpdate
End With
007 用DATA控件绑定报表控件打印报表 98-8-09
1 在数据库中生成一TEMP表。
2 用报表生成器生成报表,然后删除数据库中的TEMP表。
3 在VB中打开数据库,用OPENRECORDSET语句生成一个RECORDSET
(此RECORDSET的结构要与第一步生成的TEMP表一样,但记录数可以
用WHERE子句限制)
用SET DATA1.RECORDSET=RS(RECORDSET)将RECORDSET的数据赋予数据控件。
4 设定报表控件的REPORTFILENAME属性为报表文件名;
REPORTSOURCE属性为3;
DATASOURCE属性为数据控件名
5 执行ME.CR1.ACTION=1即可打印。
但我不知如何直接利用RECORDSET中的数据,如果你知道请告知。
感谢由 FENG 提供该技巧。
006 取得正确的 RecordCount 值 98-8-03
特别是在 RecordSet 中记录比较多的情况,在更新 RecordSet 后
RecordCount 返回的值一般比真实的值要小,
以下的方法可以保证得到正确的值:
Data1.Recordset.MoveLast
RCount = Data1.Recordset.RecordCount 
005 锁住数据库中的表 98-8-02
把表达式 True=False 放到表的 ValidationRule
属性就能锁上。 HardLockTable 实现了该功能。
声明
Public MyDB As Database
Dim Dummy As Integer
函数
Function HardLockTable (ByVal whichAction As String, ByVal aTable As String) As
Integer
On Error GoTo HardLockTableError
HardLockTable = True
Select Case whichAction
Case "Lock"
MyDB.TableDefs(aTable).ValidationRule = "True=False"
MyDB.TableDefs(aTable).ValidationText = "This table locked via " &
"ValidationRule on " & Now
Case "UnLock"
MyDB.TableDefs(aTable).ValidationRule = ""
MyDB.TableDefs(aTable).ValidationText = ""
Case "TestThenUnLock"
If MyDB.TableDefs(aTable).ValidationRule = "True=False" Then
MyDB.TableDefs(aTable).ValidationRule = ""
MyDB.TableDefs(aTable).ValidationText = ""
End If
End Select
HardLockTableErrorExit:
'subFlushDBEngine
'optional, see next suggestion
Exit Function
HardLockTableError:
HardLockTable = False
MsgBox Error$ & " error " & "in HardLockTable trying " &
"to " & whichAction & " " & aTable
Resume HardLockTableErrorExit
End Function
使用例子
'上锁
Dummy = HardLockTable("Lock", "TestTable")
' 开锁
Dummy = HardLockTable("UnLock", "TestTable")
004 Data 控件使用有密码的 Access 数据库 98-7-28
使用 Data 控件打开 Accecc 数据库:
设置 Connect 属性为 ;pwd=_密码_
修改密码:
Data1.Database.NewPassword _老密码_, _新密码_
003 处理在 Access 数据库中的 Null 值
Access
的字符串字段可以包含 NULL 值。在读这些字段到 VB 的 String
变量时,会出现运行时间的错误。最好的解决方法是使用 &
操作符将该字段与空串连接:
sString = "" & RS(0)
002 表或查询是否存在
在 VB5 中需要 Microsoft DAO 3.x Object Library。
Public Const NameNotInCollection = 3265
Dim DB As Database
Private Function ExistsTableQuery(TName As String) As Boolean
Dim Test As String
On Error Resume Next
' 该名字在表名中是否存在。
Test = db.TableDefs(TName).Name
If Err <> NameNotInCollection Then
ExistsTableQuery = True
' Reset the error variable:
Err = 0
' 该名字在查询中是否存在。
Test = db.QueryDefs(TName$).Name
If Err <> NameNotInCollection Then
ExistsTableQuery = True
End If
End If
End Function
001 连接Data到多个表单
假设 Form1,Form2 表单都有 Data 控件,在 Form2 的 Form_Load
事件中加入以下的代码,可以实现对DATA 的多个连接。
Sub Form_Load ()
Set Data1.Recordset = Form1.Data1.Recordset
End Sub
|